package com.hsy.boot.service.util;

import org.apache.commons.lang3.time.DateUtils;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;

/**
 * 时间工具类
 *
 * @author huoshengyu
 * @version 1.0
 * @date 2019-11-28 13:36:00
 */
public class DateUtil extends DateUtils {
    private static final ZoneId DEFAULT_ZONE_ID = ZoneId.systemDefault();
    private static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss";

    public DateUtil() throws IllegalAccessException {
        throw new IllegalAccessException();
    }

    /**
     * 获取当前日期字符串
     *
     * @return String
     */
    public static String getNowString() {
        return getNowString(DEFAULT_PATTERN);
    }

    /**
     * 根据格式获取当前日期字符串
     *
     * @param pattern 格式
     * @return String
     */
    public static String getNowString(String pattern) {
        return getDateString(LocalDateTime.now(), pattern);
    }

    /**
     * 获取日期字符串
     *
     * @param localDateTime 日期
     * @param pattern       格式
     * @return String
     */
    public static String getDateString(LocalDateTime localDateTime, String pattern) {
        return DateTimeFormatter.ofPattern(pattern).format(localDateTime);
    }

    /**
     * 通过date类型转换成String类型日期
     *
     * @param date 日期
     * @return String
     */
    public static String getDateString(Date date) {
        return getDateString(date, DEFAULT_PATTERN);
    }

    /**
     * 通过date类型转换成String类型日期
     *
     * @param date    日期
     * @param pattern 格式
     * @return String
     */
    public static String getDateString(Date date, String pattern) {
        return getDateString(LocalDateTime.ofInstant(date.toInstant(), DEFAULT_ZONE_ID), pattern);
    }

    /**
     * 计算相差多少天
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return long
     */
    public static Long getDiffDays(Date startDate, Date endDate) {
        return ChronoUnit.DAYS.between(dateToLocalDateTime(startDate), dateToLocalDateTime(endDate));
    }

    /**
     * date转换为LocalDateTime
     *
     * @param date 时间
     * @return LocalDateTime
     */
    public static LocalDateTime dateToLocalDateTime(Date date) {
        return LocalDateTime.ofInstant(date.toInstant(), DEFAULT_ZONE_ID);
    }
}
